class Solution918 {
    public static void main(String[] args) {
        int[] arr = {1,-2,3,-2} ;
        System.out.println(maxSubarraySumCircular(arr));

    }
    public static int maxSubarraySumCircular(int[] nums) {
        int n = nums.length ;
        // 最大值在数组里 
        int[] fdp = new int[n+1] ; 
        int fmax = Integer.MIN_VALUE ; // 情况1的最大值
        //最大值在环形里
        int[] gdp = new int[n+1] ; 
        int gmin = Integer.MAX_VALUE ; // 情况2的最小值
        // 记录总和
        int sum = 0 ; 
        for(int i=1 ; i <= n ; i ++){
            int ret = nums[i-1] ; 
            fdp[i] = Math.max(ret , fdp[i-1] + ret) ;
            fmax = Math.max(fmax , fdp[i]) ; 
            gdp[i] = Math.min(ret , gdp[i-1] + ret) ;
            gmin = Math.min(gmin , gdp[i]);
            sum += ret ; 
        }
 
       
        // 如果 sum 等于 gmin 返回fmax或sum ,  返回 max (fmax  ,  sum-gmin)
        return sum == gmin ? fmax : Math.max(fmax , sum-gmin) ; 
    }
}